﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Control;
using System.Drawing;
using Model;
using System.Data;

namespace PJRScrum
{
    public class View
    {
        private static View singleton;
        private Winkelwagen beste;
        private ViewP1 viewP1;
        private ViewP2 viewP2;
        private Bitmap plattegrond;        
        public event EventHandler OplossingErbij;
        public event EventHandler BesteOplossingGevonden;

        private View()
        {
            viewP1 = new ViewP1();
            viewP2 = new ViewP2();
            viewP2.BesteOplossingGevonden += new EventHandler(viewP2_BesteOplossingGevonden);
            viewP2.OplossingErbij += new EventHandler(viewP2_OplossingErbij);
        }

        void viewP2_OplossingErbij(object sender, EventArgs e)
        {
            if (OplossingErbij != null)
                OplossingErbij(sender, e);
        }

        void viewP2_BesteOplossingGevonden(object sender, EventArgs e)
        {
            this.beste = sender as Winkelwagen;
            if (BesteOplossingGevonden != null)
                BesteOplossingGevonden(sender, e);
        }

        public void VeranderAlgoritme(TypeAlgoritme type)
        {
            viewP1.VeranderAlgoritme(type);
        }

        public void StopAlgoritme()
        {
            viewP1.StopAlgoritme();
        }

        public Winkelwagen GetBesteUitkomst()
        {
            return viewP2.GetBesteUitkomst();
        }

        public static View GetInstance()
        {
            if (singleton == null)
            {
                singleton = new View();
            }
            return singleton;
        }

        public void VoegRekToe(Point[] punten)
        {
            viewP1.MaakRek(punten);
        }

        public void VoegRekToe(Rek rek)
        {
            viewP1.VoegRekToe(rek);
        }

        public void VoegPOIToe(POI punt)
        {
            viewP1.VoegPOIToe(punt);
        }

        public List<string> LaadCategorie()
        {
            viewP1.LaadCategorie();
            return viewP2.LaadCategorie;
        }

        public List<Rek> LaadRekken()
        {
            return viewP2.LaadRekken;
        }

        public DataSet LaadNaamId()
        {
            return viewP1.LaadNaamId();
        }

        public void SlaAfbeeldingOp(Image img1)
        {
            viewP1.SlaAfbeeldingOp(img1);
        }

        public void VoegArtikelToe(string klasse, string naam, double prijs, int volume, string categorie)
        {
            Artikel artikel = new Artikel();
            artikel.Klasse = klasse;
            artikel.Naam = naam;
            artikel.Prijs = prijs;
            artikel.Volume = volume;
            artikel.Categorie = categorie;
            viewP1.VoegArtikelToe(artikel);
        }


        public List<Artikel> LaadArtikelen(string categorie)
        {
            return viewP1.LaadArtikelen(categorie);
        }

        public void RouteOphalenVoorPrinten()
        {
            //viewP1.
        }

        public void VerwijderArtikel(int id)
        {
            viewP1.VerwijderArtikel(id);
        }

        /// <summary>
        /// Laad de beschikbare winkels die in de database opgeslagen staan.
        /// </summary>
        /// <returns>Lijst met alle beschikbare winkels</returns>
        public List<string> LaadAlleWinkels()
        {
            return viewP1.LaadAlleWinkels();
        }

        /// <summary>
        /// Bereken de route die de gebruiker moet gaan bewandelen.
        /// </summary>
        /// <param name="winkel">Een plattegrond met de locatie van rekken en producten</param>
        /// <param name="categoriën">De categoriën die de gebruiker mee wilt laten spelen in de route</param>
        /// <param name="snelheid">De snelheid in m/s</param>
        /// <param name="tijd">De tijd in seconde</param>
        /// <param name="bedrag">Het bedrag in euro's</param>
        public void BerekenRoute(List<string> categoriën, int snelheid, int tijd, int bedrag, double factor)
        {
            viewP1.VoerAlgoritmeUit(categoriën, snelheid, tijd, bedrag, factor);
        }

        public Image Plattegrond
        {
            get { return Winkel.GetInstance().Plattegrond; }
            set { plattegrond = (Bitmap)value; }
        }

        public Winkelwagen Beste
        {
            get { return beste; }
        }
    }
}
